<?php
	//匿名函数即闭包函数的应用
	//1.第1最经常用作回调函数（callback）参数的值
	echo preg_replace_callback('~-([a-z])~',function($match){
		return strtoupper($match[1]);
	},'hello-world');
	echo "<br>";
	
	//2.匿名函数变量赋值及使用
	$greet=function($name){
		printf("Hello %s\r\n",$name);
	};
	$greet("Tom");
	
	//3.闭包可以从父作用域中继承变量。 任何此类变量都应该用 use 语言结构传递进去。
	$message = 'hello';
	// 没有 "use"
	$example = function () {
	    var_dump($message);
	};
  	//echo $example();  //这里报错 未定义的变量$message
	
	// 继承 $message
	$example = function () use ($message) {
	    var_dump($message);
	};
	echo $example(); //这里输出hello
	
	// Inherited variable's value is from when the function
	// is defined, not when called
	$message = 'world';
	echo $example(); //这里输出hello
	
	// Reset message
	$message = 'hello';
	
	// Inherit by-reference  方法重写 体现出参数&的区别
	$example = function () use (&$message) {
	    var_dump($message);
	};
	echo $example();  //这里输出hello
	
	// The changed value in the parent scope
	// is reflected inside the function call
	$message = 'world';
	echo $example();  //这里输出world 
	
	// Closures can also accept regular arguments
	$example = function ($arg) use ($message) {
	    var_dump($arg . ' ' . $message);
	}; 
	$example("hello"); //这里输出hello world 
